home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Communication / PhoneMemo / Source / TurboTextField.m < prev    next >
Text File  |  1992-07-23  |  3KB  |  116 lines

  1. /* TurboTextField.m
  2.  *
  3.  *   TurboTextField is a subclass of TextField which installs
  4.  * the TurboTFCell class as it's Cell class.  It also overrides
  5.  * textDidGetKeys:isEmpty: in order to support "length watching"
  6.  * and the ability to restore the previous text after a paste has
  7.  * failed because it is too long.
  8.  * 
  9.  *
  10.  * You may freely copy, distribute, and reuse the code in this example.
  11.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  12.  * fitness for any particular use.
  13.  *
  14.  * Written by:  Sharon Zakhour 
  15.  * Created:  Oct/91
  16.  */
  17.  
  18. #import "TurboTextField.h"
  19. #import "TurboTFCell.h"
  20.  
  21. @implementation TurboTextField
  22.  
  23. // See the README.rtf file (change history -- 4/27/92) for more information
  24. // as to why the cell class is set in -initFrame as opposed to +initialize.
  25. - initFrame:(const NXRect *)frameRect
  26. {
  27.     id newTextField;
  28.    
  29.     [[self class] setCellClass: [TurboTFCell class]];
  30.     newTextField = [super initFrame:frameRect];
  31.     [[self class] setCellClass: [TextFieldCell class]];
  32.     return newTextField;
  33. }
  34.  
  35. - setMaxLength: (int) length
  36. {
  37.     return [cell setMaxLength: length];
  38. }
  39.  
  40. - setAutoJump: (BOOL) flag forLength: (int)length
  41. {
  42.     return [cell setAutoJump: flag forLength: length];
  43. }
  44.  
  45. - setAcceptsReturn: (BOOL) flag
  46. {
  47.     return [cell setAcceptsReturn: flag];
  48. }
  49.  
  50. - setCustomFilter: (NXTextFilterFunc)aFilter
  51. {
  52.     return [cell setCustomFilter: aFilter];
  53. }
  54.  
  55. #define TOO_LONG        1
  56. #define ILLEGAL_STRING    2
  57.  
  58. - textDidGetKeys:sender isEmpty:(BOOL)flag
  59. {
  60.     int oldLen, error = 0;
  61.     char     *temp;
  62.     
  63.     if (!flag)
  64.     {
  65.     temp = malloc([cell maxLength] + 1);
  66.     [sender getSubstring:temp start:0 length:[cell maxLength]];
  67.     temp[[cell maxLength]] = '\0';
  68.  
  69.     // First check to see if the string is too long.  This will only
  70.     // occur when pasting since the text and character filters
  71.     // handle keyboard entry.
  72.     if ([cell maxLength] && [sender textLength] > [cell maxLength])
  73.     {
  74.         error = TOO_LONG;
  75.     }
  76.     
  77.     // Next, run this text through the filter.  This will
  78.     // catch any illegally formatted paste.
  79.     if ([cell checkString: temp] == NO)
  80.     {
  81.         error = ILLEGAL_STRING;
  82.     }
  83.  
  84.     switch (error)
  85.     {
  86.     case 0:
  87.         // No error -- so save current input text and return
  88.         [cell setOriginalText: temp];
  89.         return self;
  90.     case TOO_LONG:
  91.         NXBeep();
  92.         NXRunAlertPanel (NULL,  "String too long...","OK", NULL, NULL);
  93.         break;
  94.     case ILLEGAL_STRING:
  95.         NXBeep();
  96.         NXRunAlertPanel (NULL,  "Illegally formatted string...","OK", NULL, NULL);
  97.         break;
  98.     }
  99.     
  100.     // Now replace the original text (because an error was encountered)
  101.     [sender setSel: 0 : [sender textLength]];
  102.     oldLen = strlen([cell originalText]);
  103.     if (oldLen)
  104.         [sender replaceSel : [cell originalText]];
  105.     else
  106.         [sender replaceSel: ""];
  107.     [sender setSel: oldLen: oldLen];
  108.     }
  109.     
  110.     // If a delegate has been installed, let it have a crack at this...
  111.     [super textDidGetKeys: sender isEmpty: flag];
  112.     return self;
  113. }
  114.  
  115. @end
  116.